home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-2.iso / Files II / Prog / M / MacOberon 4.0.sit / MacOberon 4.0 / Toolbox Interfaces / SampleApp.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1993-10-25  |  18.5 KB  |  473 lines  |  [.Ob./.Ob5]

  1. Syntax10.Scn.Fnt
  2. ParcElems
  3. Alloc
  4. Syntax10i.Scn.Fnt
  5. Chicago10.Scn.Fnt
  6. MODULE SampleApp;  (* mf/od/mf 25.10.93*)
  7. (* This Sample Text Editor shows how to use MacOberon to develop standalone Macintosh Applications. This application does NOT show how to write Macintosh programs! It is intended to demonstrate the use of MacOberon, for programmers already familiar with the Macintosh toolbox.
  8.     Click the following commands to compile, link and launch the application:
  9.     Compile the toolbox files if necessary:
  10.         Compiler.Compile
  11.             MacMemory.Mod/s    MacImaging.Mod/s
  12.             MacToolbox.Mod/s    MacFiles.Mod/s
  13.             MacProcesses.Mod/s    MacOSUtils.Mod/s
  14.             MacMoreToolbox.Mod/s    MacText.Mod/s
  15.             MacIAC.Mod/s    ~
  16.     Compiler.Compile SampleApp.Mod ~
  17.     ApplLinker.Link SampleApp SAMP ~    2nd parameter is creator
  18.     ApplLinker.Launch SampleApp
  19. Edit.Open DK.MacOberonApp.Text for more information on how to create standalone Macintosh applications using MacOberon. *)
  20. IMPORT
  21.     SYSTEM,
  22.     TB:=MacToolbox, ME:=MacMemory, TE:=MacText, IM:=MacImaging,
  23.     MF:=MacFiles, MP:=MacProcesses, MT:=MacMoreToolbox, MO:=MacOSUtils;
  24. CONST
  25.     (* Apple Menu *)    
  26.         mApple=256; iAbout=1;
  27.     (* File Menu *)
  28.         mFile=257; iNew=1; iOpen=2; iClose=3; iSave=5; iPageSetUp=7; iPrint=8; iQuit=10;
  29.     (* Edit Menu *)
  30.         mEdit=258; iCut=3; iCopy=4; iPaste=5; iClear=6; iSelectAll=8;
  31.     (* Font Menus *)
  32.         mFont=259; mSize=260;
  33.     (* Alerts *)
  34.         aAbout=1000;
  35.     (* Controls *)
  36.         rVScroll=128;
  37.     DocPtr = POINTER- TO DocRec;
  38.     DocRec = RECORD        (* Datatype for our documents *)
  39.         data: TE.TEHandle;
  40.         vScrollBar: TB.ControlHandle;
  41.     END;
  42.     wcount: SHORTINT;    (* Application Window Number *)
  43.     gPrint: IM.THPrint;    (* global Printhandle *)
  44. (* Two general routines for adjusting rectangles of the textwindows *)
  45.     PROCEDURE GetTERect(window: TB.WindowPtr; VAR teRect: IM.Rect);
  46.     BEGIN    teRect:=window.portRect; IM.InsetRect(teRect, 4, 4 ); DEC(teRect.right, 15); DEC(teRect.bottom, 15)
  47.     END GetTERect;
  48.     PROCEDURE AdjustViewRect(docTE: TE.TEHandle);
  49.     BEGIN    docTE.p.viewRect.bottom:=
  50.         (((docTE.p.viewRect.bottom-docTE.p.viewRect.top) DIV docTE.p.lineHeight)*docTE.p.lineHeight)+docTE.p.viewRect.top
  51.     END AdjustViewRect;
  52. (* Creates and returns a new TextEdit window *)
  53.     PROCEDURE NewWindow(): TB.WindowPtr;
  54.         VAR winTitle: ME.Str255; wbounds, tbounds: IM.Rect; window: TB.WindowPtr; text: TE.TEHandle; newDoc: DocPtr; info: TE.FontInfo;
  55.     BEGIN    
  56.         wbounds.top:=IM.QuickDraw.screenBits.bounds.top+40+10*(wcount MOD 10);    (* Open new window *)
  57.         wbounds.left:=IM.QuickDraw.screenBits.bounds.left+20+10*(wcount MOD 10);
  58.         wbounds.bottom:=IM.QuickDraw.screenBits.bounds.bottom-20;
  59.         wbounds.right:=IM.QuickDraw.screenBits.bounds.right-50; INC(wcount);
  60.         winTitle[0]:=3X; winTitle[1]:=23X; winTitle[2]:=CHR((wcount DIV 10) MOD 10+30H); winTitle[3]:=CHR(wcount MOD 10+30H);
  61.         window:=TB.NewWindow(NIL, wbounds, winTitle, FALSE, 0, SYSTEM.VAL(TB.WindowPtr, -1), TRUE, 0);
  62.         IM.SetPort(window);
  63.         GetTERect(window, tbounds);
  64.         text:=TE.TENew(tbounds, tbounds);    (* Add textedit structure and set default font *)
  65.         text.p.txFont:=4;text.p.txSize:=9;
  66.         TE.TextFont(4);TE.TextSize(9);
  67.         TE.GetFontInfo(info);
  68.         text.p.lineHeight:=info.ascent+info.descent+info.leading;
  69.         text.p.fontAscent:=info.ascent;
  70.         AdjustViewRect(text);
  71.         TE.TEAutoView(TRUE, text);        
  72.         SYSTEM.PUTREG(0, LONG(LONG(SIZE(DocRec))));    (* use two LONG to prevent from a MOVE.B instruction *)
  73.         ME.NewPtrClear;
  74.         SYSTEM.GETREG(8, newDoc);
  75.         newDoc.data:=text;
  76.         newDoc.vScrollBar:=TB.GetNewControl(rVScroll, window);    (* Add scrollbar *)
  77.         window.refCon:=SYSTEM.VAL(LONGINT, newDoc);    (* We use the window refcon to store our data pointer *)
  78.         RETURN window
  79.     END NewWindow;
  80. (* Routines for text scrolling and updating *)
  81.     PROCEDURE AdjustTE(window: TB.WindowPtr);
  82.         VAR myDoc: DocPtr;
  83.     BEGIN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  84.         TE.TEPinScroll((myDoc.data.p.viewRect.left-myDoc.data.p.destRect.left),
  85.             (myDoc.data.p.viewRect.top-myDoc.data.p.destRect.top)-(TB.GetCtlValue(myDoc.vScrollBar)*myDoc.data.p.lineHeight),
  86.             myDoc.data)
  87.     END AdjustTE;
  88.     PROCEDURE AdjustScrollSizes(window: TB.WindowPtr);
  89.         VAR myDoc: DocPtr; teTop, teRight, teBottom: INTEGER; teRect: IM.Rect;
  90.     BEGIN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  91.         GetTERect(window, teRect);
  92.         teTop:=window.portRect.top;
  93.         teRight:=window.portRect.right;
  94.         teBottom:=window.portRect.bottom;
  95.         myDoc.data.p.viewRect:=teRect;
  96.         AdjustViewRect(myDoc.data);
  97.         TB.MoveControl(myDoc.vScrollBar, teRight-15, -1);
  98.         TB.SizeControl(myDoc.vScrollBar, 16, (teBottom-teTop)-13);
  99.     END AdjustScrollSizes;
  100.     PROCEDURE AdjustScrollValues(window: TB.WindowPtr);
  101.         VAR myDoc: DocPtr; max, lines, value: INTEGER;
  102.     BEGIN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  103.         lines:=myDoc.data.p.nLines;
  104.         max:=lines-((myDoc.data.p.viewRect.bottom-myDoc.data.p.viewRect.top) DIV myDoc.data.p.lineHeight);
  105.         IF max<0 THEN max:=0 END;
  106.         TB.SetCtlMax(myDoc.vScrollBar, max);
  107.         value:=(myDoc.data.p.viewRect.top-myDoc.data.p.destRect.top) DIV myDoc.data.p.lineHeight;
  108.         IF value<0 THEN value:=0 END;IF value>max THEN value:=max END;
  109.         TB.SetCtlValue(myDoc.vScrollBar, value);
  110.         TB.ShowControl(myDoc.vScrollBar)
  111.     END AdjustScrollValues;
  112.     PROCEDURE AdjustScrollBars(window: TB.WindowPtr; resize: BOOLEAN);
  113.         VAR myDoc: DocPtr;
  114.     BEGIN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  115.         myDoc.vScrollBar.p.contrlVis:=0;
  116.         IF resize THEN AdjustScrollSizes(window) END;
  117.         AdjustScrollValues(window)
  118.     END AdjustScrollBars;
  119. (* Use StandardGetFile to select and open a plain ASCII text file *)
  120.     PROCEDURE OpenFile;
  121.         VAR myTypes: MF.SFTypeList; myReply: MF.StandardFileReply; window: TB.WindowPtr;
  122.             inFile: INTEGER; err: INTEGER; theSize: LONGINT; buffer: ME.Ptr; myDoc: DocPtr;
  123.     BEGIN    myTypes[0]:=054455854H;    (* TEXT *)
  124.         MF.StandardGetFile(NIL, 1, myTypes, myReply);
  125.         IF myReply.sfGood THEN
  126.             window:=NewWindow();
  127.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  128.             TB.SetWTitle(window, SYSTEM.VAL(ME.Str255, myReply.sfFile.name));
  129.             err:=MF.FSpOpenDF(myReply.sfFile, 0, inFile);
  130.             err:=MF.GetEOF(inFile, theSize);
  131.             IF theSize>7FFFH THEN theSize:=7FFFH END;    (* Limitation of TextEdit, max 32768 chars *)
  132.             err:=MF.SetFPos(inFile, 1, 0);
  133.             SYSTEM.PUTREG(0, 8000H);
  134.             ME.NewPtr;
  135.             SYSTEM.GETREG(8, buffer);
  136.             err:=MF.FSRead(inFile, theSize, buffer);
  137.             err:=MF.FSClose(inFile);
  138.             TE.TESetText(buffer, theSize, myDoc.data);
  139.             AdjustScrollBars(window, TRUE);
  140.             AdjustTE(window);
  141.             TB.ShowWindow(window);
  142.             SYSTEM.PUTREG(8, buffer);
  143.             ME.DisposePtr
  144.         END
  145.     END OpenFile;
  146. (* Close the front window *)
  147.     PROCEDURE CloseWindow;
  148.         VAR window: TB.WindowPtr; myDoc: DocPtr;
  149.     BEGIN    window:=TB.FrontWindow();
  150.         IF window=NIL THEN RETURN END;
  151.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  152.         TE.TEDispose(myDoc.data);
  153.         TB.CloseWindow(window);
  154.         SYSTEM.PUTREG(8, myDoc);
  155.         ME.DisposePtr
  156.     END CloseWindow;
  157. (* Save the content of the front window to a file *)
  158.     PROCEDURE SaveWindow;
  159.         VAR myReply: MF.StandardFileReply; prompt, defname: ME.Str255; myDoc: DocPtr;
  160.             window: TB.WindowPtr; myFile: INTEGER; err: INTEGER; size: LONGINT;
  161.     BEGIN    window:=TB.FrontWindow();
  162.         IF window=NIL THEN RETURN END;
  163.         TB.SetStr255(prompt, 'Save file as:');
  164.         TB.SetStr255(defname, 'Untitled');
  165.         MF.StandardPutFile(prompt, defname, myReply);    (* Select a filename *)
  166.         IF myReply.sfGood THEN
  167.             IF myReply.sfReplacing THEN err:=MF.FSpDelete(myReply.sfFile) END;
  168.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  169.             err:=MF.FSpCreate(myReply.sfFile, 045444954H, 054455854H, 0);    (* Create a new file *)
  170.             err:=MF.FSpOpenDF(myReply.sfFile, 0, myFile);
  171.             IF err=0 THEN
  172.                 size:=myDoc.data.p.teLength;
  173.                 err:=MF.FSWrite(myFile, size, myDoc.data.p.hText.p);    (* Write the text data *)
  174.                 err:=MF.FSClose(myFile)
  175.             END
  176.         END
  177.     END SaveWindow;
  178. (* Print the content of the front window *)
  179.     PROCEDURE DoPageSetUp;
  180.         VAR ignore: BOOLEAN;
  181.     BEGIN    IM.PrOpen;
  182.         ignore:=IM.PrStlDialog(gPrint);    (* Get Pagesetup *)
  183.         IM.PrClose
  184.     END DoPageSetUp;
  185.     PROCEDURE DoPrint;
  186.         VAR myDoc: DocPtr; window: TB.WindowPtr; pages: INTEGER;
  187.             lines: INTEGER; prPort: IM.GrafPtr; line, page: INTEGER; lh, y: INTEGER;
  188.     BEGIN    window:=TB.FrontWindow();
  189.         IF window=NIL THEN RETURN END;
  190.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  191.         IM.PrOpen;
  192.         IF IM.PrJobDialog(gPrint) THEN    (* Get printing options *)
  193.             prPort:=IM.PrOpenDoc(gPrint, NIL, 0);
  194.             lines:= (prPort.portRect.bottom - prPort.portRect.top) DIV myDoc.data.p.lineHeight;
  195.             pages:= myDoc.data.p.nLines DIV lines;
  196.             line:=0;page:=0;
  197.             WHILE page<=pages DO
  198.                 IM.PrOpenPage(prPort, NIL);
  199.                 TE.TextFont(myDoc.data.p.txFont);
  200.                 TE.TextSize(myDoc.data.p.txSize);
  201.                 lh:=myDoc.data.p.lineHeight;
  202.                 y:=lh;
  203.                 REPEAT
  204.                     IM.MoveTo(20, y);
  205.                     TE.DrawText(myDoc.data.p.hText.p, myDoc.data.p.lineStarts[line], myDoc.data.p.lineStarts[line+1]-
  206.                         myDoc.data.p.lineStarts[line]-1);
  207.                     INC(line);
  208.                     INC(y, lh);
  209.                 UNTIL ((line>myDoc.data.p.nLines)OR((line MOD lines)=0));
  210.                 IM.PrClosePage(prPort);
  211.                 INC(page);
  212.             END;
  213.             IM.PrCloseDoc(prPort);
  214.         END;
  215.         IM.PrClose
  216.     END DoPrint;
  217. (* Clickroutine for scrollbar *)
  218.     PROCEDURE VertAction(control: TB.ControlHandle; part: INTEGER);
  219.         VAR scrollDistance:INTEGER; window: TB.WindowPtr; myDoc: DocPtr; oldSetting, max: INTEGER;
  220.     BEGIN
  221.         IF part#0 THEN
  222.             window:=control.p.contrlOwner;
  223.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  224.             CASE part OF
  225.             |    TB.inUpButton, TB.inDownButton: scrollDistance:=1
  226.             |    TB.inPageUp, TB.inPageDown: scrollDistance:=10
  227.             END;
  228.             IF (part=TB.inDownButton) OR (part=TB.inPageDown) THEN scrollDistance:=-scrollDistance END;
  229.             oldSetting:=TB.GetCtlValue(control);
  230.             max:=TB.GetCtlMax(control);
  231.             scrollDistance:=oldSetting-scrollDistance;
  232.             IF scrollDistance<0 THEN scrollDistance:=0 END;IF scrollDistance>max THEN scrollDistance:=max END;
  233.             TB.SetCtlValue(control, scrollDistance);
  234.             scrollDistance:=oldSetting-scrollDistance;
  235.             IF scrollDistance#0 THEN TE.TEPinScroll(0, scrollDistance*myDoc.data.p.lineHeight, myDoc.data) END;
  236.         END
  237.     END VertAction;
  238. (* Process the clicking into a text window *)
  239.     PROCEDURE DoContentClick(window: TB.WindowPtr; event: TB.EventRecord);
  240.         VAR control: TB.ControlHandle; value, part: INTEGER; myDoc: DocPtr; teRect: IM.Rect;
  241.     BEGIN    IM.SetPort(window);
  242.         IM.GlobalToLocal(event.where);
  243.         GetTERect(window, teRect);
  244.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  245.         IF ~IM.PtInRect(event.where, teRect) THEN    (* Click into scrollbar? *)
  246.             part:=TB.FindControl(event.where, window, control);
  247.             CASE part OF
  248.             |    0:
  249.             |    TB.inThumb:
  250.                         value:=TB.GetCtlValue(control);
  251.                         part:=TB.TrackControl(control, event.where, NIL);
  252.                         IF part#0 THEN
  253.                             value:=value - TB.GetCtlValue(control);
  254.                             IF value#0 THEN TE.TEPinScroll(0, value*myDoc.data.p.lineHeight, myDoc.data) END
  255.                         END
  256.             ELSE
  257.                 part:=TB.TrackControl(control, event.where, VertAction)
  258.             END
  259.         ELSE TE.TEClick(event.where, FALSE, myDoc.data) END    (* Click into window *)
  260.     END DoContentClick;
  261. (* Process the selecton of a menu item *)
  262.     PROCEDURE MenuCommand(menuResult: LONGINT);    (* Item has been Chosen by MenuSelect or MenuKey *)
  263.         VAR menu, item: INTEGER; Name: ME.Str255; daRefNum: INTEGER; itemHit: INTEGER; window: TB.WindowPtr;
  264.             myDoc:DocPtr; fontID, fsize: INTEGER; fInfo: TE.FontInfo; oldPort: IM.GrafPtr;
  265.     BEGIN    menu:=SHORT(menuResult DIV 10000H); item:=SHORT(menuResult MOD 10000H);   (* Get menu and item number *)
  266.         window:=TB.FrontWindow();
  267.         IF window#NIL THEN myDoc:=SYSTEM.VAL(DocPtr, window.refCon) END;
  268.         CASE    menu    OF
  269.         |    mApple:
  270.                     IF item=iAbout THEN itemHit:=TB.Alert(aAbout, NIL) ELSE
  271.                         TB.GetItem(TB.GetMHandle(mApple), item, Name); daRefNum:=TB.OpenDeskAcc(Name)
  272.                     END
  273.         |    mFile:
  274.                     CASE item OF
  275.                     |    iNew: window:=NewWindow();AdjustScrollBars(window, TRUE);TB.ShowWindow(window)
  276.                     |    iOpen: OpenFile;
  277.                     |    iClose: CloseWindow;
  278.                     |    iPageSetUp: DoPageSetUp;
  279.                     |    iPrint: DoPrint;
  280.                     |    iSave: SaveWindow;
  281.                     |    iQuit: MP.ExitToShell
  282.                     ELSE END
  283.         |    mEdit:
  284.                     IF window#NIL THEN
  285.                         CASE item OF    (* We don't exchange our data with the clipboard *)
  286.                         |    iCut: TE.TECut(myDoc.data);
  287.                         |    iCopy: TE.TECopy(myDoc.data);
  288.                         |    iPaste: TE.TEPaste(myDoc.data);
  289.                         |    iClear: TE.TEDelete(myDoc.data);
  290.                         |    iSelectAll: TE.TESetSelect(0, 32767, myDoc.data)
  291.                         ELSE END;
  292.                         AdjustScrollBars(window, FALSE)
  293.                     END
  294.         |    mFont:
  295.                     IF window#NIL THEN
  296.                         TB.GetItem(TB.GetMHandle(mFont), item, Name);
  297.                         TE.GetFNum(Name, fontID);
  298.                         IM.GetPort(oldPort);
  299.                         IM.SetPort(myDoc.data.p.inPort);
  300.                         TE.TextFont(fontID);
  301.                         myDoc.data.p.txFont:=fontID;
  302.                         AdjustScrollBars(window, TRUE);
  303.                         AdjustTE(window);
  304.                         TB.InvalRect(window.portRect);
  305.                         IM.SetPort(oldPort)
  306.                     END
  307.         |    mSize:
  308.                     IF window#NIL THEN
  309.                         CASE item OF
  310.                         |    1: fsize:=9;
  311.                         |    2: fsize:=10;
  312.                         |    3: fsize:=12;
  313.                         |    4: fsize:=18;
  314.                         |    5: fsize:=24
  315.                         ELSE END;
  316.                         IM.GetPort(oldPort);
  317.                         IM.SetPort(myDoc.data.p.inPort);
  318.                         TE.TextSize(fsize);
  319.                         myDoc.data.p.txSize:=fsize;
  320.                         TE.GetFontInfo(fInfo);
  321.                         myDoc.data.p.lineHeight:=fInfo.ascent+fInfo.descent+fInfo.leading;
  322.                         myDoc.data.p.fontAscent:=fInfo.ascent;
  323.                         AdjustScrollBars(window, TRUE);
  324.                         AdjustTE(window);
  325.                         TB.InvalRect(window.portRect);
  326.                         IM.SetPort(oldPort)
  327.                     END
  328.         ELSE END;
  329.         TB.HiliteMenu(0)
  330.     END MenuCommand;
  331. (* Help routine for update *)
  332.     PROCEDURE GetLocalUpdateRgn(window: TB.WindowPtr; localRgn: IM.RgnHandle);
  333.     BEGIN
  334.         IM.CopyRgn(window.updateRgn, localRgn);
  335.         IM.OffsetRgn(localRgn, window.portBits.bounds.left, window.portBits.bounds.top)
  336.     END GetLocalUpdateRgn;
  337. (* Handle activating or deactivating of a text window  *)
  338.     PROCEDURE DoActivate(window: TB.WindowPtr; active: BOOLEAN);
  339.         VAR myDoc: DocPtr; growRect: IM.Rect;
  340.     BEGIN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  341.         IF active THEN
  342.             TE.TEActivate(myDoc.data);
  343.             myDoc.vScrollBar.p.contrlVis:=-1;
  344.             TB.InvalRect(myDoc.vScrollBar.p.contrlRect);
  345.             growRect:=window.portRect;
  346.             growRect.left:=growRect.right-15;
  347.             growRect.top:=growRect.bottom-15;
  348.             TB.InvalRect(growRect);
  349.         ELSE
  350.             TE.TEDeactivate(myDoc.data);
  351.             TB.HideControl(myDoc.vScrollBar);
  352.             TB.DrawGrowIcon(window)
  353.         END
  354.     END DoActivate;
  355. (* Main loop of our program - handles all incoming events *)
  356.     PROCEDURE Loop();
  357.         VAR gotEvent: BOOLEAN; event: TB.EventRecord; window: TB.WindowPtr;
  358.             key: INTEGER; newsize: LONGINT; myDoc: DocPtr; growRect, oldViewRect: IM.Rect;
  359.             locUpdateRgn: IM.RgnHandle; theResult: BOOLEAN;
  360.     BEGIN
  361.         LOOP    gotEvent:=TB.WaitNextEvent(TB.everyEvent, event, 0, NIL);
  362.             CASE    event.what    OF
  363.             |    TB.mouseDown:
  364.                         CASE    TB.FindWindow(event.where, window)    OF
  365.                         |    TB.inMenuBar:    MenuCommand(TB.MenuSelect(event.where))
  366.                         |    TB.inSysWindow:    TB.SystemClick(event, window)
  367.                         |    TB.inContent:
  368.                                     IF    window # TB.FrontWindow()    THEN TB.SelectWindow(window)
  369.                                     ELSE DoContentClick(window, event)
  370.                                     END
  371.                         |    TB.inDrag:    TB.DragWindow(window, event.where, IM.QuickDraw.screenBits.bounds)
  372.                         |    TB.inGoAway:    IF TB.TrackGoAway(window, event.where) THEN TB.CloseWindow(window) END
  373.                         |    TB.inGrow:
  374.                                     IM.SetPort(window);
  375.                                     IM.SetRect(growRect, 64, 64, 2000, 2000);
  376.                                     newsize:=TB.GrowWindow(window, event.where, growRect);
  377.                                     IF newsize#0 THEN
  378.                                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  379.                                         oldViewRect:=myDoc.data.p.viewRect;
  380.                                         locUpdateRgn:=IM.NewRgn();
  381.                                         GetLocalUpdateRgn(window, locUpdateRgn);
  382.                                         TB.SizeWindow(window, SHORT(newsize MOD 10000H), SHORT(newsize DIV 10000H), TRUE);
  383.                                         AdjustScrollBars(window, TRUE);
  384.                                         AdjustTE(window);
  385.                                         TB.InvalRect(window.portRect);
  386.                                         theResult:=IM.SectRect(oldViewRect, myDoc.data.p.viewRect, oldViewRect);
  387.                                         TB.ValidRect(oldViewRect);
  388.                                         TB.InvalRgn(locUpdateRgn);
  389.                                         IM.DisposeRgn(locUpdateRgn);
  390.                                     END;
  391.                         |    TB.inDesk, TB.inZoomIn, TB.inZoomOut:
  392.                         END;
  393.             |    TB.keyDown, TB.autoKey:    (* check if cmdkey is pressed *)
  394.                         key:=SHORT(event.message MOD 100H);
  395.                         IF    8 IN SYSTEM.VAL(SET, LONG(event.modifiers))    THEN    MenuCommand(TB.MenuKey(key))
  396.                         ELSE
  397.                             window:=TB.FrontWindow();
  398.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  399.                             TE.TEKey(key, myDoc.data);    (* Enter key in text *)
  400.                             AdjustScrollBars(window, FALSE)
  401.                         END
  402.             |    TB.updateEvt:
  403.                         window:=SYSTEM.VAL(TB.WindowPtr, event.message);
  404.                         IF window#NIL THEN
  405.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  406.                             TB.BeginUpdate(window);
  407.                                 IM.SetPort(window);
  408.                                 IM.EraseRect(window.portRect);
  409.                                 TB.DrawControls(window);
  410.                                 TB.DrawGrowIcon(window);
  411.                                 TE.TEUpdate(window.portRect, myDoc.data);
  412.                             TB.EndUpdate(window)
  413.                         END;
  414.             |    TB.activateEvt:    (* modifiers: bit0:  0=deactivate 1=activate *)
  415.                         window:=SYSTEM.VAL(TB.WindowPtr, event.message);
  416.                         IF window#NIL THEN DoActivate(window, ODD(event.modifiers)) END;
  417.             |    TB.osEvt:
  418.                         window:=TB.FrontWindow();
  419.                         IF    window#NIL    THEN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  420.                             IF    SYSTEM.LSH(event.message, -24) (*MOD 100H*)=TB.suspendResumeMessage    THEN
  421.                                 IF    ODD(event.message)    THEN    (* Activate *)
  422.                                     IM.SetPort(window); TE.TEActivate(myDoc.data); IM.InitCursor
  423.                                 ELSE    (* Deactivate *)
  424.                                     TE.TEDeactivate(myDoc.data); IM.InitCursor
  425.                                 END
  426.                             END
  427.                         ELSE IM.InitCursor END
  428.             |    TB.nullEvent:
  429.                     window:=TB.FrontWindow();
  430.                     IF window#NIL THEN
  431.                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  432.                         TE.TEIdle(myDoc.data)
  433.                     END
  434.             ELSE    (* Ignore Other Event Types *)
  435.             END
  436.         END
  437.     END Loop;
  438. (* Initalize all menus, variables etc  *)
  439.     PROCEDURE InitMac;
  440.         VAR systemversion: LONGINT;
  441.     BEGIN
  442.         ME.MaxApplZone;
  443.         ME.MoreMasters;
  444.         IM.InitGraf(IM.QuickDraw.thePort);    (* The QuickDraw Globals are proper Oberon Variables *)
  445.         TE.InitFonts;
  446.         TB.InitWindows;
  447.         TB.InitMenus;
  448.         TE.TEInit;
  449.         TB.InitDialogs(NIL);
  450.         IM.InitCursor;
  451.         SYSTEM.PUTREG(0, 0FFFF0000H);    (* everyEvent *)
  452.         TB.FlushEvents;
  453.         SYSTEM.PUTREG(0, 73797376H);    (* gestaltSystemVersion: sysv, check for system 7 *)
  454.         MO.Gestalt;
  455.         SYSTEM.GETREG(8, systemversion);
  456.         IF systemversion < 0700H THEN
  457.             MT.SysBeep(1);
  458.             MP.ExitToShell
  459.         END;
  460.         TB.SetMenuBar(TB.GetNewMBar(128));    (* Set up menus *)
  461.         TB.AddResMenu(TB.GetMHandle(mApple), 44525652H);
  462.         TB.AddResMenu(TB.GetMHandle(mFont), 464F4E54H);
  463.         TB.DrawMenuBar;
  464.         SYSTEM.PUTREG(0, 120);    (* Set up print structure *)
  465.         ME.NewHandle;
  466.         SYSTEM.GETREG(8, gPrint);
  467.         IM.PrOpen;
  468.         IM.PrintDefault(gPrint);
  469.         IM.PrClose
  470.     END InitMac;
  471. BEGIN    InitMac; Loop()
  472. END SampleApp.
  473.